package com.zha.boss.util;

/**
 * @Author: zha
 * @CreateTime: 2024年09月05日 13:22
 */

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * JWT工具类
 */
public class JWTUtil {


    // 自定义秘钥
    public static final String JWT_SECRET = "W0fd3)iYp@uy34dsb/0OT";

    /**
     * 生成jwt
     * @return
     */
    public static String createJWT(String data, int timeoutMinute) {
        //组装头数据
        Map<String, Object> header = new HashMap<>();
        header.put("alg", "HS256");
        header.put("typ", "JWT");

        //设置过期时间
        DateTime expireDate = DateUtil.offsetMinute(new Date(), timeoutMinute);

        //链式编程
        return JWT.create()
                //头部
                .withHeader(header)
                //过期时间
                .withExpiresAt(expireDate)
                //负载：自定义数据
                .withClaim("data", data)
                //签名：前面需要指定一个密钥
                .sign(Algorithm.HMAC256(JWT_SECRET));
    }

    /**
     * 解析jwt负载里面的数据
     *
     * @param jwt
     * @return
     */
    public static String parseJWT(String jwt) {
        try {
            // 使用签名密钥创建一个jwt验证对象
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(JWT_SECRET)).build();

            //使用jwt验证对象验证以下JWT，返回一个解码后的jwt。 encode编码 decode解码
            DecodedJWT decodedJWT = jwtVerifier.verify(jwt);
            Claim user = decodedJWT.getClaim("user");
            return user.asString();
        } catch (TokenExpiredException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 验证jwt
     *
     * @param jwt
     * @return
     */
    public static Boolean verifyJWT(String jwt) {
        try {
            // 使用密钥创建一个jwt验证对象
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(JWT_SECRET)).build();

            //使用jwt验证对象验证jwt，如果该方法没有抛出异常，就说明jwt验证通过，否则就是验证未通过
            jwtVerifier.verify(jwt);

            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
}
